package com.solar.etl.log;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * 日志封装，提供了静态方法的DEBUG,INFO,WARN,ERROR级别日志调用，目前系统不支持 JDK Log
 * 
 * @author ShiChaoMeng
 * 
 */
public class LogUtils {
	/**
	 * 默认调用深度
	 */
	private static final int INTER_STACKTRACE_DEEP = 2;
	private static final int BEGIN_STATE = 0;
	private static final int SUCCESS_STATE = 1;
	private static final int ERROR_STATE = -1;

	/**
	 * debug信息
	 * 
	 * @param message
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void debug(String message, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().debug(message);
	}

	/**
	 * debug信息
	 * 
	 * @param message
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void debug(String message, Throwable t, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().debug(message, t);
	}

	/**
	 * 
	 * @param message
	 */
	public static void debug(Object message) {
		getLogger().debug(message);
	}

	/**
	 * 
	 * @param message
	 * @param t
	 */
	public static void debug(Object message, Throwable t) {
		getLogger().debug(message, t);
	}

	/**
	 * info级别信息
	 * 
	 * @param message
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void info(String message, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().info(message);
	}

	/**
	 * info信息
	 * 
	 * @param message
	 * @param t
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void info(String message, Throwable t, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().info(message, t);
	}

	/**
	 * 
	 * @param message
	 */
	public static void info(Object message) {
		getLogger().info(message);
	}

	/**
	 * 
	 * @param message
	 * @param t
	 */
	public static void info(Object message, Throwable t) {
		getLogger().info(message, t);
	}

	/**
	 * warn级别信息
	 * 
	 * @param message
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void warn(String message, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().warn(message);
	}

	/**
	 * warn信息
	 * 
	 * @param message
	 * @param t
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void warn(String message, Throwable t, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().warn(message, t);
	}

	/**
	 * 
	 * @param message
	 */
	public static void warn(Object message) {
		getLogger().warn(message);
	}

	/**
	 * 
	 * @param message
	 * @param t
	 */
	public static void warn(Object message, Throwable t) {
		getLogger().warn(message, t);
	}

	/**
	 * error级别信息
	 * 
	 * @param message
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void error(String message, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().error(message);
	}

	/**
	 * error级别信息
	 * 
	 * @param message
	 * @param t
	 * @param params
	 *            可变参数，支持{}参数格式化
	 */
	public static void error(String message, Throwable t, Object... params) {
		if (params.length > 0) {
			message = MsgFormatter.arrayFormat(message, params);
		}
		getLogger().error(message, t);
	}

	/**
	 * 
	 * @param message
	 */
	public static void error(Object message) {
		getLogger().error(message);
	}

	/**
	 * 
	 * @param message
	 * @param t
	 */
	public static void error(Object message, Throwable t) {
		getLogger().error(message, t);
	}

	/**
	 * 
	 * @return
	 */
	public static int getBeginstate() {
		return BEGIN_STATE;
	}

	/**
	 * 
	 * @return
	 */
	public static int getSuccessstate() {
		return SUCCESS_STATE;
	}

	/**
	 * 
	 * @return
	 */
	public static int getErrorstate() {
		return ERROR_STATE;
	}

	/**
	 * 获取真实调用LogUtils静态方法的类名，然后将Logger初始化
	 */
	private static Log getLogger() {
		/**
		 * TODO 可能需要做优化，目前每次请求都新返回一个Logger对象
		 */
		final Throwable t = new Throwable();
		final StackTraceElement[] methodCaller = t.getStackTrace();
		return LogFactory.getLog(methodCaller[INTER_STACKTRACE_DEEP]
				.getClassName());
	}

}
